
package io.fabric8.openclustermanagement.api.model.cluster.v1beta1;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.processing.Generated;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.fabric8.kubernetes.api.builder.Editable;
import io.fabric8.kubernetes.api.model.Container;
import io.fabric8.kubernetes.api.model.ContainerPort;
import io.fabric8.kubernetes.api.model.EnvVar;
import io.fabric8.kubernetes.api.model.IntOrString;
import io.fabric8.kubernetes.api.model.KubernetesResource;
import io.fabric8.kubernetes.api.model.LabelSelector;
import io.fabric8.kubernetes.api.model.LocalObjectReference;
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.kubernetes.api.model.ObjectReference;
import io.fabric8.kubernetes.api.model.PersistentVolumeClaim;
import io.fabric8.kubernetes.api.model.PodTemplateSpec;
import io.fabric8.kubernetes.api.model.ResourceRequirements;
import io.fabric8.kubernetes.api.model.Volume;
import io.fabric8.kubernetes.api.model.VolumeMount;
import io.sundr.builder.annotations.Buildable;
import io.sundr.builder.annotations.BuildableReference;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;

/**
 * Group the created placementDecision into decision groups based on the number of clusters per decision group.
 */
@JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "clustersPerDecisionGroup",
    "decisionGroups"
})
@ToString
@EqualsAndHashCode
@Accessors(prefix = {
    "_",
    ""
})
@Buildable(editableEnabled = false, validationEnabled = false, generateBuilderPackage = false, lazyCollectionInitEnabled = false, builderPackage = "io.fabric8.kubernetes.api.builder", refs = {
    @BuildableReference(ObjectMeta.class),
    @BuildableReference(LabelSelector.class),
    @BuildableReference(Container.class),
    @BuildableReference(PodTemplateSpec.class),
    @BuildableReference(ResourceRequirements.class),
    @BuildableReference(IntOrString.class),
    @BuildableReference(ObjectReference.class),
    @BuildableReference(LocalObjectReference.class),
    @BuildableReference(PersistentVolumeClaim.class),
    @BuildableReference(EnvVar.class),
    @BuildableReference(ContainerPort.class),
    @BuildableReference(Volume.class),
    @BuildableReference(VolumeMount.class)
})
@Generated("io.fabric8.kubernetes.schema.generator.model.ModelGenerator")
public class GroupStrategy implements Editable<GroupStrategyBuilder>, KubernetesResource
{

    @JsonProperty("clustersPerDecisionGroup")
    private IntOrString clustersPerDecisionGroup;
    @JsonProperty("decisionGroups")
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<DecisionGroup> decisionGroups = new ArrayList<>();
    @JsonIgnore
    private Map<String, Object> additionalProperties = new LinkedHashMap<String, Object>();

    /**
     * No args constructor for use in serialization
     */
    public GroupStrategy() {
    }

    public GroupStrategy(IntOrString clustersPerDecisionGroup, List<DecisionGroup> decisionGroups) {
        super();
        this.clustersPerDecisionGroup = clustersPerDecisionGroup;
        this.decisionGroups = decisionGroups;
    }

    /**
     * Group the created placementDecision into decision groups based on the number of clusters per decision group.
     */
    @JsonProperty("clustersPerDecisionGroup")
    public IntOrString getClustersPerDecisionGroup() {
        return clustersPerDecisionGroup;
    }

    /**
     * Group the created placementDecision into decision groups based on the number of clusters per decision group.
     */
    @JsonProperty("clustersPerDecisionGroup")
    public void setClustersPerDecisionGroup(IntOrString clustersPerDecisionGroup) {
        this.clustersPerDecisionGroup = clustersPerDecisionGroup;
    }

    /**
     * DecisionGroups represents a list of predefined groups to put decision results. Decision groups will be constructed based on the DecisionGroups field at first. The clusters not included in the DecisionGroups will be divided to other decision groups afterwards. Each decision group should not have the number of clusters larger than the ClustersPerDecisionGroup.
     */
    @JsonProperty("decisionGroups")
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    public List<DecisionGroup> getDecisionGroups() {
        return decisionGroups;
    }

    /**
     * DecisionGroups represents a list of predefined groups to put decision results. Decision groups will be constructed based on the DecisionGroups field at first. The clusters not included in the DecisionGroups will be divided to other decision groups afterwards. Each decision group should not have the number of clusters larger than the ClustersPerDecisionGroup.
     */
    @JsonProperty("decisionGroups")
    public void setDecisionGroups(List<DecisionGroup> decisionGroups) {
        this.decisionGroups = decisionGroups;
    }

    @JsonIgnore
    public GroupStrategyBuilder edit() {
        return new GroupStrategyBuilder(this);
    }

    @JsonIgnore
    public GroupStrategyBuilder toBuilder() {
        return edit();
    }

    @JsonAnyGetter
    @JsonIgnore
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

    public void setAdditionalProperties(Map<String, Object> additionalProperties) {
        this.additionalProperties = additionalProperties;
    }

}
